package design._03_prototype.deep2;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 深拷贝 ：就是拷贝对象本身和其内部成员（无论是引用类型）都将复制一份。
 * 
 * 深拷贝实现
 *		深克隆，可以通过序列化(Serialization)等方式来实现
 *		序列化就是将对象写到流的过程，写到流中的对象是原有对象的一个拷贝，而原对象仍然存在于内存中。
 */
public class WeeklyLog  implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private String date;
	private String content;
	
	//为了简化设计和实现，假设一份工作周报中只有一个附件对象，实际情况中可以包含多个附件，可以通过List等集合对象来实现
	private Attachment attachment;
	
	//使用序列化技术实现深克隆
	public WeeklyLog deepClone() throws IOException, ClassNotFoundException{
		//将对象写入流中
		ByteArrayOutputStream bao=new ByteArrayOutputStream();
		ObjectOutputStream oos=new ObjectOutputStream(bao);
		oos.writeObject(this);
		//将对象从流中取出
		ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
		ObjectInputStream ois=new ObjectInputStream(bis);
		return (WeeklyLog)ois.readObject();
	}
	
	public void setAttachment(Attachment attachment) {
		this.attachment = attachment;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
	public Attachment getAttachment(){
		return (this.attachment);
	}
	
	public String getName() {
		return (this.name);
	}
	public String getDate() {
		return (this.date);
	}
	public String getContent() {
		return (this.content);
	}
}
